# import akshare as ak
#
# print("AKShare 版本:", ak.__version__)  # 确认为 1.17.x 或更高
# # 替换为你关注的基金代码，如 161725（招商中证白酒）
# fund_code = "161725"
#
# # 查询基金实时估值
# fund_valuation_df = ak.fund_value_estimate_em(fund_code=fund_code)
#
# print(fund_valuation_df)

# import akshare as ak
#
# # 获取某基金全部历史净值数据（以005827为例）
# fund_data = ak.fund_em_open_fund_info(fund='005827', indicator='单位净值走势')
# print(fund_data)


# import akshare as ak
# import pandas as pd
#
# fund_data = ak.fund_em_open_fund_info(fund='005827', indicator='单位净值走势')
# 获取某基金全部历史净值数据（以161725为例）
# 设置显示选项：不省略列
# pd.set_option("display.max_columns", None)
# # 防止省略行数
# pd.set_option("display.max_rows", None)
# pd.set_option("display.width", None)  # 自动适应宽度
# pd.set_option("display.unicode.ambiguous_as_wide", True)  # 让中文对齐更好（可选）
#
#
# data = ak.fund_portfolio_hold_em('010115','2025')
# print(data)

# import akshare as ak
#
# # 获取基金持仓（前10大）
# fund_portfolio_df = ak.fund_portfolio_hold_em(symbol="016371")  # 基金代码
# print(fund_portfolio_df)


import akshare as ak
import pandas as pd

def get_fund_portfolio(fund_code: str):
    """
    获取基金持仓信息（前十大重仓股）
    :param fund_code: 基金代码，例如 "161725"（招商中证白酒）
    :return: DataFrame，包含股票代码、股票名称、占净值比例
    """
    df = ak.fund_portfolio_hold_em(symbol=fund_code,date='2025')
    # 只保留需要的字段
    df = df[["股票代码", "股票名称", "占净值比例"]]
    df["占净值比例"] = df["占净值比例"].astype(float)
    return df


def get_realtime_stock_prices(stock_codes):
    """
    获取A股实时行情
    :param stock_codes: 股票代码列表
    :return: DataFrame，包含股票代码、名称、最新价、涨跌幅
    """
    df = ak.stock_zh_a_spot()
    df = df[df["代码"].isin(stock_codes)]
    return df[["代码", "名称", "最新价", "涨跌幅"]]


def calculate_fund_return(fund_code: str):
    """
    计算基金的实时估值收益率
    :param fund_code: 基金代码
    :return: 基金整体实时收益率
    """
    # 获取基金持仓
    portfolio_df = get_fund_portfolio(fund_code)

    # 获取实时行情
    stock_df = get_realtime_stock_prices(portfolio_df["股票代码"].tolist())

    # 合并数据
    merged = pd.merge(portfolio_df, stock_df, left_on="股票代码", right_on="代码", how="inner")

    # 计算加权收益：占净值比例 * 涨跌幅
    merged["加权贡献"] = merged["占净值比例"] * merged["涨跌幅"] / 100

    fund_return = merged["加权贡献"].sum()
    return fund_return, merged


if __name__ == "__main__":
    fund_code = "018123"  # 招商中证白酒指数（你可以替换为目标基金）
    portfolio = get_fund_portfolio('018956')
    print(portfolio)
    # fund_return, detail_df = calculate_fund_return(fund_code)
    #
    # print(f"基金 {fund_code} 当前估值收益率: {fund_return:.2f}%")
    # print(detail_df[["股票名称", "占净值比例", "最新价", "涨跌幅", "加权贡献"]])